iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
3

我們的目標是用Python進行網路封包分析,為了能模擬「流過去」的環境,如果對環境建置不敢興趣可以跳過這一節,監聽的時候一律對本地發送封包也行,不過本地環境必須是Linux,筆者的環境是CentOS。

我們希望能有HostA, HostB和路由器,在HostA或HostB上互相發送封包,然後在路由器上監聽,由於大家通常都只有個人電腦,用VM又太笨重,所以我使用docker為大家展示如何建置環境。

這裡只為大家介紹如何下docker的指令建置我們所要的環境,不深入探討背後的意義,首先,我們要先建立兩個網路bridge

docker network create n1
docker network create n2

下一步,起用三個docker container,分別為HostA, HostB以及router
HostA:
docker run --privileged --name hosta --network n1 -it centos:7 /bin/bash

HostB:
docker run --privileged --name hostb --network n2 -it centos:7 /bin/bash

Router:
docker run --privileged --name router --network n1 --network n2 -it centos:7 /bin/bash

然後對各自三個container裝ifconfig指令好讓能清晰知道HostA和HostB是在不同的LAN上
yum update -y && yum install net-tools nc bind-utils -y
跑完後可以自己下ifconfig檢查

我們發現HostA和HostB互ping不會通,但是ping外網就會通,那是因為Host的gateway還沒設定
首先,在router上下ifconfig看router的ip是什麼,會有兩個ip,假設HostA和router共用一個bridgeA,Router在bridgeA的ip是ipA,在HostB上的就是bridgeB和ipB,那麼在HostA下如下指令新增gateway
route add default gw ipA bridgeA
HostB也要
route add default gw ipB bridgeB

之後兩邊互ping,就ping的通了,代表HostA走HostB一定會經過Router,我們就能在Router上分析流過的網路封包。

系列的成果將會放在這:https://github.com/kaichiachen/pytcpdump
文章配合著程式碼有助於學習 :)


上一篇
Day03 TCP/IP五層結構
下一篇
Day05 Socket初探
系列文
那些年還給老師的TCP/IP五層結構 - 用Python進行網路封包分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

1
roke1845
iT邦新手 5 級 ‧ 2020-10-07 08:08:02

Hi kaichiaboy大,

  1. 我在router中, 看到了127.0.0.1跟172.21.0.3這兩個IP, 不知道這樣是否符合你說的兩個IP?
  2. 我執行route add default gw後, 會出現SIOCADDRT: No such device

對網路這塊不是很熟,再麻煩大大解惑。

  1. 127.0.0.1是router的localhost IP,外面ping這個ip是ping不通的,所以不算喔。172.21.0.3這個ip算
  2. 承接上面,這個指令是在Host下,不是在router下。先在Host下ifconfig指令看172.21.0.x屬於哪個bridge,假設是eth0好了,那就執行route add default gw 172.21.0.3 eth0,代表我的gateway走router的172.21.0.3

還有不懂的歡迎可以留言!

1
maxcian
iT邦新手 5 級 ‧ 2020-10-11 20:05:20

感謝分享~

但當我想要 run router container 時出現了以下錯誤:

docker: Error response from daemon: Container cannot be connected to network endpoints n1, n2

我的作業平台為 macOS 10.15.7,安裝的 docker 版本為:

$ docker --version
Docker version 19.03.13, build 4484c46d9d

查了一下資料,發現有文章(Multiple Docker Networks)提到若有多個 networks 時,只能在 run 的時候給第一個 network、接著再用 docker 指令給第二個 network。修正後我運行 router 的指令改成如下:

$ docker run --privileged --name router --network=n1 -it centos:7 /bin/bash
$ docker network connect n2 router

然後檢查 hosta 的 eth0:

[root@ca37d295a60b /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.2  netmask 255.255.0.0  broadcast 172.18.255.255
        ether 02:42:ac:12:00:02  txqueuelen 0  (Ethernet)
        RX packets 10973  bytes 15837939 (15.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4950  bytes 272095 (265.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

hostb 的 eth0:

[root@226e6f67172b /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.19.0.2  netmask 255.255.0.0  broadcast 172.19.255.255
        ether 02:42:ac:13:00:02  txqueuelen 0  (Ethernet)
        RX packets 11019  bytes 15840536 (15.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4277  bytes 235841 (230.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

router 的網卡資訊:

[root@7f94a5cec465 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.3  netmask 255.255.0.0  broadcast 172.18.255.255
        ether 02:42:ac:12:00:03  txqueuelen 0  (Ethernet)
        RX packets 13  bytes 1006 (1006.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.19.0.3  netmask 255.255.0.0  broadcast 172.19.255.255
        ether 02:42:ac:13:00:03  txqueuelen 0  (Ethernet)
        RX packets 12  bytes 936 (936.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

基於以上資訊,在 hostaping 172.19.0.2 (試圖 ping hostb),會無法。

此時在 hosta 中加入以下 gateway:

[root@ca37d295a60b /]# route add default gw 172.18.0.3 eth0
  • 172.18.0.3routern1 的 IP

hostb 中加入以下 gateway:

[root@226e6f67172b /]# route add default gw 172.19.0.3 eth0
  • 172.19.0.3routern2 的 IP

hosta hostb 就能順利 ping 向彼此了~

是的,關鍵是要加上gateway,讓host知道要經過哪個閘道

我要留言

立即登入留言